"""

这个 `BatchMarkdownMergeProcessor` 类具有以下特点：

1. 它接受输入文件夹、输出文件路径和可选的配置文件作为参数。

2. 如果没有提供配置文件，它会使用默认的配置文件 `config/batch_markdown_merge_config_default_text.yml`。

3. 它会遍历输入文件夹中的所有 markdown 文件（包括子文件夹），并按文件路径名称排序。

4. 对于每个 markdown 文件，它会：
   - 使用文件名作为 h1 标题。
   - 将原有的标题级别都增加一级（例如 h1 变成 h2，h2 变成 h3，以此类推）。
   - 根据配置文件中的规则删除指定的字符串。

5. 所有处理后的文件内容会被合并成一个大的 markdown 文件。

6. 它提供了一个命令行接口，可以直接从命令行运行批处理。

7. 它也可以在 Python 代码中直接使用。

使用这个程序时，你需要提供一个符合要求的 YAML 配置文件。例如：

```yaml
string:
  delete_string: ["**", "其他需要删除的字符串"]
```

这个程序会根据这些规则处理每个 markdown 文件，然后将它们合并成一个大的 markdown 文件。
"""


import os
import yaml
from pathlib import Path
import re

class BatchMarkdownMergeProcessor:
    def __init__(self, input_folder: str, output_filepath: str, config_file: str = None):
        self.input_folder = Path(input_folder)
        self.output_filepath = Path(output_filepath)
        self.config_file = Path(config_file) if config_file else None
        self.config = {}
        self.errors = []

    def load_config(self):
        if self.config_file is None or not self.config_file.exists():
            # 使用默认配置文件
            default_config = Path(__file__).parent / 'configs' / 'batch_markdown_merge_config_default_text.yml'
            if not default_config.exists():
                raise FileNotFoundError(f"Default config file not found: {default_config}")
            self.config_file = default_config
            print(f"使用默认的配置文件 Using default config file: {self.config_file}")

        with open(self.config_file, 'r', encoding='utf-8') as file:
            self.config = yaml.safe_load(file)

    def process(self):
        # 检查输入文件夹是否存在
        if not self.input_folder.exists():
            raise FileNotFoundError(f"Input folder not found: {self.input_folder}")

        # 确保输出文件的父目录存在
        self.output_filepath.parent.mkdir(parents=True, exist_ok=True)

        # 加载配置文件
        self.load_config()

        # 获取所有markdown文件并排序
        markdown_files = sorted(self.input_folder.rglob('*.md'))

        # 合并文件
        merged_content = []
        for file in markdown_files:
            try:
                merged_content.append(self._process_file(file))
            except Exception as e:
                self.errors.append(f"Error processing {file}: {str(e)}")

        # 写入合并后的内容
        with open(self.output_filepath, 'w', encoding='utf-8') as f:
            f.write('\n\n'.join(merged_content))

        print(f"Merged markdown file created: {self.output_filepath}")

        # 输出所有异常
        if self.errors:
            print("Errors encountered during processing:")
            for error in self.errors:
                print(error)

    def _process_file(self, file: Path) -> str:
        # 读取文件内容
        with open(file, 'r', encoding='utf-8') as f:
            content = f.read()

        # 使用文件名作为h1标题
        filename = file.stem
        content = f"# {filename}\n  正文 \n{content}"

        # 增加所有标题的级别
        content = re.sub(r'^(#+)', r'#\1', content, flags=re.MULTILINE)

        # 删除指定的字符串
        if 'string' in self.config and 'delete_string' in self.config['string']:
            for string in self.config['string']['delete_string']:
                content = content.replace(string, '')

        return content

def main():
    import argparse

    parser = argparse.ArgumentParser(description="Batch merge markdown files based on config.")
    parser.add_argument("-i", "--input", required=True, help="Input folder containing markdown documents")
    parser.add_argument("-o", "--output", required=True, help="Output filepath for merged markdown")
    parser.add_argument("-c", "--config", help="Path to the YAML config file (optional)")
    args = parser.parse_args()

    processor = BatchMarkdownMergeProcessor(args.input, args.output, args.config)
    processor.process()

if __name__ == "__main__":
    main()

"""
使用示例：
# 使用默认配置文件
python3 -m document2llm.io.batch_markdown_merge -i input_documents -o output/merged.md

# 使用自定义配置文件
python3 -m document2llm.io.batch_markdown_merge -i input_documents -o output/merged.md -c custom_config.yml

或者在Python代码中：

from document2llm.io.batch_markdown_merge import BatchMarkdownMergeProcessor

# 使用默认配置文件
processor = BatchMarkdownMergeProcessor("input_documents", "output/merged.md")
processor.process()

# 使用自定义配置文件
processor = BatchMarkdownMergeProcessor("input_documents", "output/merged.md", "custom_config.yml")
processor.process()
"""


#
